<?php
    //1.定义命名空间与本文件所在目录层级相同（houdunwang\model）
    //2.因为composer自动载入类的需要
    //3.命名空间namespace之前不能有输出！
    namespace houdunwang\model;

    //1.定义模型类用于去Base类查找相应的方法
    //2.传递由database.php中传递过来的数据库配置信息
    class Model{

        //1.私有属性用于存储数据库配置
        //2.以传递给Base类用于链接数据库
        private static $config;

        //1.当Entry类的arc方法访问无法访问的方法时自动触发该函数
        //2.调用以下的parseAction()实例化Base类（去其中查找相应的方法）
        public function __call($funcName, $arguments){
            return self::parseAction($funcName, $arguments);
        }

        //1.当Entry类的arc方法访问无法访问的静态方法时自动触发该函数
        //2.调用以下的parseAction()实例化Base类（去其中查找相应的方法）
        public static function __callStatic($funcName, $arguments){
            return self::parseAction($funcName, $arguments);
        }

        //1.接收由database.php接收过来的数据库配置信息
        //2.将配置信息存储至私有属性$config中
        //3.用于传递给Base类以链接数据库
        public static function setConfig($config){
            self::$config = $config;
        }


        //1.实例化Base类调用其中的方法
        //2.将数据库配置信息及调用的表名传递给Base类
        public static function parseAction($funcName, $arguments){
            //1.获取调用的类名
            //2.例子：system\model\Article
            $table = get_called_class();
            //1.获取表名用于传递给Base类进行查询操作
            //2.需要截取出表名、转换成小写、去掉“\”
            //要加上转义符，否则会报错（将引号转义处理）
            $table = strtolower(ltrim(strrchr($table,"\\"),"\\"));
            //实例化Base类传递数据库配置信息及表名
            $obj = new Base(self::$config,$table);
            //调用Base类中方法（方法名由Entry类中arc方法调用的某方法传递过来）
            return call_user_func_array([$obj,$funcName],$arguments);
        }






    }